package com.example.xaop.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;

/**
 * @author xingyulai
 * @date 2024/3/14 3:41 PM
 * @description
 **/
@Aspect
@Component
public class CustomAspect {

    //    @Around("@annotation(com.example.xaop.Haha)")
    @Around("@annotation(TestMapping)")
    public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
        // 前置通知（方法执行前的操作）
        System.out.println("Before method execution");

        // 获取方法签名
        Signature signature = pjp.getSignature();


        // 获取方法的简单名称
        String methodName = signature.getName();

        // 获取方法的类名
        String className = signature.getDeclaringTypeName();

        // 获取方法的所有参数
        Object[] args = pjp.getArgs();

        // 获取方法的参数名称（这通常需要额外的库或配置才能获取）
        String[] parameterNames = this.getParameterNames(pjp);

        // 执行原方法（可以选择是否执行以及何时执行）
        Object result = pjp.proceed(args);

        // 后置通知（方法执行后的操作）
        System.out.println("After method execution");

        // 返回目标方法的执行结果
        return "不好意思 消息被代理了";
    }

    private String[] getParameterNames(ProceedingJoinPoint pjp) {

        Signature signature = pjp.getSignature();
        if (signature instanceof MethodSignature) {
            MethodSignature methodSignature = (MethodSignature) signature;
            String[] parameterNames = methodSignature.getParameterNames();
            return parameterNames;
        }

        // 这是一个简化的示例，实际代码可能依赖于反射API或AOP库提供的方法
        // 在Spring Framework 4.3及以上版本，可以使用ReflectionUtils.MethodInvocationInfo来获取参数名
        // 在纯AspectJ中，可以通过org.aspectj.lang.reflect.MethodSignature#getParameterNames()获取
        return new String[]{};
    }


}
